# -*- coding: utf-8 -*-
# 如果你的程序（包括注释）中包含中文，请加上上面这一行，用于指明编码（utf-8）。
# #号开头的行都是注释。

# 如何编辑本程序：
#     用任何文本编辑器均可编辑。

# 如何运行本程序：
#     在终端中，运行：python p405_exercises.py

# 本程序实现一个简单的分类算法（kNN，k-最近邻算法）。
#
# 你有两个数据集（训练集和检验集）：
#   训练集：data/iris.training.arff
#   检验集：data/iris.test.arff
# 这两个文件的格式是一样的。每一行数据代表一个数据对象，包括
# 四个属性（分别是花萼和花瓣的长度和宽度，均为实数）和
# 一个类别（鸢尾花的子类别，字符串）。
# 文件中以%或@开头的行或空行均应忽略。
#
# kNN算法如下：
# （1）对于测试集中的每个数据对象，计算它与训练集中每个对象之间的差异，
# 即它的四个属性与训练集中每个对象的四个属性之间的欧几里得距离：
#     dist(x, y) = math.sqrt((x1-y1)**2 + (x2-y2)**2 + (x3-y3)**2 + (x4-y4)**2)
# 其中x1,...,x4 和 y1,...,y4 分别是两个对象的四个属性值。
# （2）将这些距离按从低到高排序，选择k个距离最短（即最近邻）的训练数据，
# 将这k个训练数据的主要类别作为测试数据的类别（分类结果）。
# （3）将分类结果与真实类别进行比较。统计正确分类的数目和比例。
#
# TODO: 选择 k=1,3,5,7,9，记录正确分类的百分比（保留小数点后两位）：
#   k       准确率
#   1       ？
#   3       ？
#   5       ？
#   7       ？
#   9       ？

# TODO：你的姓名：？

import math


def dist(obj1, obj2):
    '''计算并返回两个数据对象之间的距离。
    '''
    #TODO: 计算并返回一个实数。


def read_training_data(training_filename):
    '''从training_filename文件中读取训练数据，
    保存在一个列表中，读取结束后返回该列表。
    '''
    training_list = []
    
    #TODO: 从文件中读取训练数据并填入training_list。
    
    return training_list

    
def classify(training_list, test_obj, k):
    '''kNN算法。
    training_list: 训练数据集。
    test_obj: 一个测试数据对象。
    k：kNN参数。
    返回：测试对象的类别。
    '''
    #TODO: 你的代码。


# 程序从这里开始运行：
training_list = read_training_data('data/iris.training.arff')
K = 1  # 可修改
# TODO：
# （1）打开测试集文件
# （2）对测试集中的每一个对象test_obj，调用
#        label = classify(training_list, test_obj, K)
# （3）比较label与test_obj真实类别，更新正确分类或者错误分类的数目。
# （4）计算分类的准确率。


    
    
    



